package br.com.inner.modelo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity
@Table(name="Usuario")
@NamedQueries({
	@NamedQuery(name="UsuariosPK",
			query="SELECT MAX(u.cdUsuario) FROM Usuario u"),
	@NamedQuery(name="Usuario",
			query="SELECT u FROM Usuario u WHERE u.cdUsuario = :cdUsuario"),
	@NamedQuery(name="NomeUsuario",
			query="SELECT u FROM Usuario u WHERE u.empresa.nomeFantasia like :nmUsuario"),
	@NamedQuery(name="VerificaSenha",
			query="SELECT u FROM Usuario u WHERE u.nmUsuario = :nmUsuario AND u.passUsuario = :passUsuario"),
	@NamedQuery(name="VerificaSenhaCodigo",
			query="SELECT u FROM Usuario u WHERE u.cdUsuario = :cdUsuario AND u.passUsuario = :passUsuario"),
	@NamedQuery(name="Operadores",
			query="SELECT u FROM Usuario u WHERE u.tipoUsuario like :tpUsuario")
})
public class Usuario {
	
	@Id
	@GeneratedValue(generator="UsuarioTab")
	@TableGenerator(name="UsuarioTab", table="TABLE_GEN",
            pkColumnName="ID_NAME", valueColumnName="ID_VAL",
            pkColumnValue="USUARIO_GEN", allocationSize=1)
	@Column(name="cdUsuario", length=3)
	private BigDecimal cdUsuario;
	
	@Column(name="nomeContato1", length=50)
	private String nomeContato1;
	
	@Column(name="cargoContato1", length=50)
	private String cargoContato1;
	
	@Column(name="setorContato1", length=50)
	private String setorContato1;
	
	@Column(name="telefoneContato1", length=50)
	private String telefoneContato1;
	
	@Column(name="ramalContato1", length=50)
	private String ramalContato1;
	
	@Column(name="celularContato1", length=50)
	private String celularContato1;
	
	@Column(name="emailContato1", length=50)
	private String emailContato1;
	
	@Column(name="nmUsuario", length=50)
	private String nmUsuario;
	
	@Column(name="passUsuario", length=50)
	private String passUsuario;
	
	@Enumerated(EnumType.STRING)
	@Column(name="statusUsuario", length=1)
	private Status statusUsuario;

	@Enumerated(EnumType.STRING)
	@Column(name="tipoUsuario", length=1)
	private TipoUsuario tipoUsuario;
	
	@Column(name="emailUsuario", length=50)
	private String emailUsuario;
	
	@Column(name="dtCadastro")
	@Temporal(TemporalType.DATE)
	private Date dtCadastro;
	
	@OneToOne(cascade=CascadeType.PERSIST)
	@JoinColumn(name="cdEmpresa", referencedColumnName = "cdEmpresa")
	private Empresa empresa;
	
	@OneToMany(mappedBy="usuario")
	private List<Job> job;
	
	@Transient
	private boolean contrato;
	
	public Usuario(){
		super();
	}
	
	public Usuario(BigDecimal cdUsuario){
		this.cdUsuario = cdUsuario;
	}
	
	public Usuario(BigDecimal cdUsuario, String nmUsuario){
		this.cdUsuario = cdUsuario;
		this.nmUsuario = nmUsuario;
	}

	/**
	 * @return the cdUsuario
	 */
	public BigDecimal getCdUsuario() {
		return cdUsuario;
	}

	/**
	 * @param cdUsuario the cdUsuario to set
	 */
	public void setCdUsuario(BigDecimal cdUsuario) {
		this.cdUsuario = cdUsuario;
	}

	/**
	 * @return the nmUsuario
	 */
	public String getNmUsuario() {
		return nmUsuario;
	}

	/**
	 * @param nmUsuario the nmUsuario to set
	 */
	public void setNmUsuario(String nmUsuario) {
		this.nmUsuario = nmUsuario;
	}
	
	/*public void addEmpresa(Usuario usuario){
		Empresa emp = new Empresa();
		emp.setUsuario(usuario);
	}*/
	
	/*public void generatePK() throws CustomException {
		
		Query query = null;
		BigDecimal result = null;
		
		EntityManager manager = JPAManager.getEntityManager();
		query = manager.createNamedQuery("UsuariosPK");
		result = (BigDecimal)query.getSingleResult();
		if (result == null) {
			result = new BigDecimal(1);
		}else{		
			result = result.add(new BigDecimal(1));
		}
		this.setPk(result);
	}*/
	
	public Object getPk() {
		return this.getCdUsuario();
	}
	
	public void setPk(Object newId) {
		// TODO Auto-generated method stub
	}
	
	public void setPk(BigDecimal _cdUsuario) {
		// TODO Auto-generated method stub
		this.cdUsuario = _cdUsuario;
	}

	public Date getDtCadastro() {
		return dtCadastro;
	}

	public void setDtCadastro(Date dtCadastro) {
		this.dtCadastro = dtCadastro;
	}

	public String getPassUsuario() {
		return passUsuario;
	}

	public void setPassUsuario(String passUsuario) {
		this.passUsuario = passUsuario;
	}


	public Status getStatusUsuario() {
		return statusUsuario;
	}

	public void setStatusUsuario(Status statusUsuario) {
		this.statusUsuario = statusUsuario;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public String getCargoContato1() {
		return cargoContato1;
	}

	public void setCargoContato1(String cargoContato1) {
		this.cargoContato1 = cargoContato1;
	}

	public String getCelularContato1() {
		return celularContato1;
	}

	public void setCelularContato1(String celularContato1) {
		this.celularContato1 = celularContato1;
	}

	public String getEmailContato1() {
		return emailContato1;
	}

	public void setEmailContato1(String emailContato1) {
		this.emailContato1 = emailContato1;
	}

	public String getEmailUsuario() {
		return emailUsuario;
	}

	public void setEmailUsuario(String emailUsuario) {
		this.emailUsuario = emailUsuario;
	}

	public String getNomeContato1() {
		return nomeContato1;
	}

	public void setNomeContato1(String nomeContato1) {
		this.nomeContato1 = nomeContato1;
	}

	public String getRamalContato1() {
		return ramalContato1;
	}

	public void setRamalContato1(String ramalContato1) {
		this.ramalContato1 = ramalContato1;
	}

	public String getSetorContato1() {
		return setorContato1;
	}

	public void setSetorContato1(String setorContato1) {
		this.setorContato1 = setorContato1;
	}

	public String getTelefoneContato1() {
		return telefoneContato1;
	}

	public void setTelefoneContato1(String telefoneContato1) {
		this.telefoneContato1 = telefoneContato1;
	}

	public TipoUsuario getTipoUsuario() {
		return tipoUsuario;
	}

	public void setTipoUsuario(TipoUsuario tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}

	public List<Job> getJob() {
		return job;
	}

	public void setJob(List<Job> job) {
		this.job = job;
	}
	
	public boolean isContrato(){
		return contrato;
	}
	
	public void setContrato(boolean contrato){
		this.contrato = contrato;
	}

}
